// 购物车模块
const cart = {
  namespaced: true,
  // 存数据
  state: () => ({
    list: [] // 购物车列表
  }),
  // 基于state计算属性
  getters: {
    // 计算有效商品列表 isEffective = true  filter
    effectiveList (state) {
      return state.list.filter(item => item.isEffective === true)
    },
    // 有效商品总数量 把effctiveList中的每一项的count叠加起来
    allCount (state, getters) {
      // const list = state.list.filter(item => item.isEffective === true)
      return getters.effectiveList.reduce((a, c) => a + c.count, 0)
    },
    // 总钱数  = 所有单项的钱数累加  单项的钱数 = 数量 * 单价
    allPrice (state, getters) {
      // const list = state.list.filter(item => item.isEffective === true)
      return getters.effectiveList.reduce((a, c) => a + c.count * c.nowPrice, 0)
    },
    // 已选中列表 selected = true
    selectedList (state) {
      return state.list.filter(item => item.selected)
    },
    // 已选择列表总钱数  selectedList 中所有项的单价*数据进行叠加
    allSelectedPrice (state, getters) {
      return getters.selectedList.reduce((a, c) => a + c.count * c.nowPrice, 0)
    },
    // 全选：有效列表中的seleted字段全为true 才为true
    isAll (state, getters) {
      return getters.effectiveList.every(item => item.selected)
    }
  },
  // 唯一能改变state的数据
  mutations: {
    insertCart (state, good) {
      // 添加购物车逻辑
      console.log('加入购物车成功当前商品信息为：', good)
      // 做加入之前判断
      // 如果当前添加的商品skuId和之前完全一致  只做数量的增加  否则就添加新项
      // 数组查找：find(如果找到之后想要操作数据的字段)  findIndex(删除)
      const item = state.list.find((item) => item.skuId === good.skuId)
      if (item) {
        // 做数量的叠加
        item.count = item.count + good.count
      } else {
        // 把当前good加入list  unshift
        state.list.unshift(good)
      }
    },
    delCart (state, good) {
      // 删除逻辑
      const index = state.list.findIndex(item => item.skuId === good.skuId)
      state.list.splice(index, 1)
    },
    singleCheck (state, { good, selected }) {
      console.log(good, selected)
      // 通过good skuId  找到当前要操作的项
      // 把传下来的selected 交给找到项的selected字段即可
      const item = state.list.find(item => item.skuId === good.skuId)
      item.selected = selected
    },
    allCheck (state, checked) {
      // 遍历
      state.list.forEach(item => {
        item.selected = checked
      })
    },
    // 修改数量
    changeNum (state, { good, num }) {
      // 通过good skuId  找到当前要操作的项
      // 把传下来的selected 交给找到项的selected字段即可
      const item = state.list.find(item => item.skuId === good.skuId)
      item.count = num
    }
  },
  // 异步 + mutation
  actions: {
    // 加入购物车
    asyncInsertCart (ctx, good) {
      // 1. 区分登录和非登陆的状态
      // 2. 业务组件里想要通过dispatch().then()
      // 好处有俩个：
      // 一个是做一个操作逻辑的收敛 登录(异步)还是非登陆(同步) 都可以调用同一个action函数
      // 一个是封装成return newPromise之后 我们可以在业务组件中 dispatch().then()
      return new Promise((resolve, reject) => {
        // 登录
        if (ctx.rootState.user.profile.token) {
          // 发送接口
        } else {
          // 非登陆
          ctx.commit('insertCart', good)
          resolve()
        }
      })
    },
    // 删除
    asyncDelCart (ctx, good) {
      return new Promise((resolve, reject) => {
        // 登录
        if (ctx.rootState.user.profile.token) {
          // 发送接口
        } else {
          // 非登陆
          ctx.commit('delCart', good)
          resolve()
        }
      })
    },
    // 单选
    asyncSingleCheck (ctx, { good, selected }) {
      return new Promise((resolve, reject) => {
        // 登录
        if (ctx.rootState.user.profile.token) {
          // 发送接口
        } else {
          // 非登陆
          ctx.commit('singleCheck', { good, selected })
          resolve()
        }
      })
    },
    // 全选
    asyncAllCheck (ctx, checked) {
      return new Promise((resolve, reject) => {
        // 登录
        if (ctx.rootState.user.profile.token) {
          // 发送接口
        } else {
          // 非登陆
          ctx.commit('allCheck', checked)
          resolve()
        }
      })
    },
    // 单选
    asyncChangeNum (ctx, { good, num }) {
      return new Promise((resolve, reject) => {
        // 登录
        if (ctx.rootState.user.profile.token) {
          // 发送接口
        } else {
          // 非登陆
          ctx.commit('changeNum', { good, num })
          resolve()
        }
      })
    }
  }
}

export default cart
